package com.example.gzh.controller;

import com.example.gzh.service.WxService;
import com.example.gzh.utilsClass.WeChatUtils;
import com.example.gzh.utilsClass.WechatConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;

/**
        * 微信对接验证接口
        * */
@RestController
@RequestMapping(value = "/wechat")
public class ValidateController {
    // 第一次验证的时候，RequestMethod.POST需要改为RequestMethod.GET

    @RequestMapping(value = "", method = RequestMethod.POST)
    public void validate(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//        System.out.println("-----开始校验签名-----");
//
//        // 接收微信服务器发送请求时传递过来的参数
//        String signature = req.getParameter("signature");
//        String timestamp = req.getParameter("timestamp");
//        String nonce = req.getParameter("nonce"); //随机数
//        String echostr = req.getParameter("echostr");//随机字符串
//
//        // 将token、timestamp、nonce三个参数进行字典序排序并拼接为一个字符串

//        String TOKEN = "*******";
//        String sortStr = sort(TOKEN,timestamp,nonce);
//
//        // 字符串进行shal加密
//        String mySignature = WeChatUtils.shal(sortStr);
//
//        // 校验微信服务器传递过来的签名 和  加密后的字符串是否一致, 若一致则签名通过
//        if(!"".equals(signature) && !"".equals(mySignature) && signature.equals(mySignature)){
//            System.out.println("-----签名校验通过-----");
//            try {
//                resp.getWriter().write(echostr);
//            } catch (IOException e) {
//                e.printStackTrace();
//            }
//        }else {
//            System.out.println("-----校验签名失败-----");
//        }

        // 我们查看原始的io流中传过来的xml数据是什么样的
//        ServletInputStream is = req.getInputStream();
//        byte[] b = new byte[1024];
//        int len;
//        StringBuilder sb = new StringBuilder();
//        while(( len = is.read(b)) != -1) {
//            sb.append(new String(b,0,len));
//        }
//        System.out.println(sb);

        // 下列为包装处理接受到的xml信息
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        Map<String,String> map = null;
        try {
            map = WxService.parseRequest(req.getInputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(map);//关注测试号,给测试公众号发消息,就可以看到打印结果了

        // 以下为回复消息
        // 原始xml写法
//        String textMsg = "<xml><ToUserName><![CDATA["+map.get("FromUserName")+"]]></ToUserName><FromUserName><![CDATA["+map.get("ToUserName")+"]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你]]></Content></xml>";
//        resp.getWriter().print(textMsg);

        // 封装写法
        String respXml = WxService.getRespose(map);
        System.out.println(respXml);
        resp.getWriter().print(respXml);
    }




    /**
     * 参数排序
     * @param token
     * @param timestamp
     * @param nonce
     * @return
     */
    public static String sort(String token, String timestamp, String nonce) {
        String[] strArray = {token, timestamp, nonce};
        Arrays.sort(strArray);
        StringBuilder sb = new StringBuilder();
        for (String str : strArray) {
            sb.append(str);
        }
        return sb.toString();
    }
}
